查看原文
其他

小白学爬虫系列-基础-requests详解

小一 小一的学习笔记 2023-01-01

「关注我,和我一起放下灵魂,让灵魂去搬砖。


作者:小一

介绍:放不下灵魂的搬砖者

全文共2326字,阅读全文需9分钟


Python版本3.8.0,开发工具:Pycharm


前面已经讲过如何安装并使用 requests 进行网页内容获取。但是requests 的功能可不止这些,跟我一起来看看吧



1. 获取内容

url = 'https://movie.douban.com/top250'
response = requests.get(url)
# 打印响应结果的状态码、编码方式、cookie等内容
print(response.status_code)
print(response.encoding)
print(response.cookies)

通过requests 的 get 方法获取豆瓣电影TOP 250 的响应内容,包括状态码、编码、cookie等

运行结果如下:

418
None
<RequestsCookieJar[]>

不对啊,我要的结果呢?还有418是个什么神仙状态码?于是机智的我赶紧 google 了一下

htcpcp1.0协议中的418的意义是:当客户端给一个茶壶发送泡咖啡的请求时,茶壶就返回一个418错误状态码,表示“我是一个茶壶”。

查完更懵了,这又是个什么神仙解释?

不管了,反正就是返回不正确。会不会是因为豆瓣对访问进行头部识别?刚好上一节也说过怎么设置头部,说搞就搞

url = 'https://movie.douban.com/top250'
headers = {
'User-Agent''Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
}
response = requests.get(url=url, headers=headers)
# 打印响应结果的状态码、编码方式、cookie等内容
print(response.status_code)
print(response.encoding)
print(response.cookies)

返回结果如下

200
utf-8
<RequestsCookieJar[<Cookie bid=N_uBlMrf9mM for .douban.com/>]>

呼,果然如此,看到200不由得在心底又夸了一下自己


上面的访问使用最基本的 get 请求,那如果我要加访问参数呢?

user_info = {'username''yiye''passwd''zhiqiu'}
response = requests.get(url=url, headers=headers, params=user_info)

什么?你说 get 请求不安全,行,那我们来试试 post 请求

user_info = {'username''yiye''passwd''zhiqiu'}
response = requests.post(url=url, headers=headers, data=user_info)
注意注意:post 请求中参数名为 data,get中为 params


当有时候我们需要传递 JSON 形式的数据时,可以使用 json.dumps() 方法对数据序列化

user_info = {'username''yiye''passwd''xiaoyi''age''18'}
response = requests.post(url=url, headers=headers, data=json.dumps(user_info))

这里解释一下什么是表单数据:

当你在登录网页时,需要你填写用户名、密码、验证码等信息进行提交,这些信息会被统一放在一个表格里面,提交给服务器进行验证。


这些提交的数据称为表单数据

同样的,当我们需要上传文件时,也可以把文件放在参数中上传

upload_file = {'file': open('test.txt''rb')}
response = requests.post(url=url, files=upload_file)



2. cookie配置

咦,小一哥,你怎么又提到了 cookie ,上节不是说过了吗?

对,没错,因为 cookie 对于需要登录的网站来说,太重要了!

当你成功登录一个网站的时候,你可以将本次登录的 cookie 保存在本地,等你下一次需要再次登录的时候,直接读取你本地的 cookie 内容,而不用再次输入用户名、密码等,是不是很方便?

# 获取浏览器cookie
b_cookies = response.cookies
# 将cookie 保存在本地
cookies = dict()
for i in b_cookies:
    cookies[i['name']] = i['value']
with open("file_path"'wb'as f:
    f.write(pickle.dumps(cookies))

# 第二次访问直接通过cookie 访问
response = requests.get(url, cookies=cookies)
print(response.status_code)
print(response.encoding)



3. 会话(session)

既然提到了cookie ,那 session 也不能落下吧。

这里先普及一下什么是cookie,什么是session?

答:“cookie通过在客户端记录信息确定用户身份,session通过在服务器端记录信息确定用户身份”。总之就是你访问一次人家就认识你了,第二次去的时候可能直接就给你开门了,而不需要再登陆。


cookie以文本格式存储在浏览器上,存储量有限;

而会话存储在服务端,可以无限量存储多个变量并且比cookie更安全

也就是说,我们同样可以通过 session 会话去访问部分网页,不同的是,这些网页是通过服务器端 session 信息验证用户,而不是通过本地 cookie。

# 1. 获取session 
session = requests.Session()
# 2. 传入本地cookies 
content = session.get(url, cookies=cookie).text
print(content)



4. 超时配置

为防止服务器响应缓慢,导致客户端处理异常。requests请求通常利用 timeout 变量来配置最大请求时间


连接超时一般设为比 3 的倍数略大的一个数值,因为 TCP 数据包重传窗口的默认大小是 3

Timeout 类型:

  • 连接超时:客户端实现到远端服务器端口的连接时 request 所等待的时间。

连接超时一般设为比 3 的倍数略大的一个数值,因为 TCP 数据包重传窗口的默认大小是 3。

  • 读取超时:客户端已经连接上服务器并且发送了request后,客户端等待服务器发送请求的时间。

一般指的是服务器发送第一个字节之前的时间。

timeout 设置单一的值,将会用作 connectread 二者的 timeout。

requests.get(url=url, timeout=5)

如果要分别制定,就需要传入一个元组

requests.get(url=url, timeout=(510))



5. SSL 证书验证

现在随处可见 https 开头的网站,Requests 可以为 HTTPS 请求验证 SSL 证书
要想检查某个主机的SSL证书,你可以使用verify 参数。默认是True,表示需要验证

# 设置 verify 参数为 False,可以跳过证书验证
response = requests.get('https://输入你的网址', verify=False)
print response.text



6. 代理

“小一哥,那什么时候会用到代理呢?”

“当然是当你要访问的网站对访问 IP 有限制的时候”

通过对任意请求方法提供 proxies 参数配置单个请求。

proxies = {
  "http""代理主机ip及端口号",
  "https""代理主机ip及端口号",
}

# 通过requests 方法设置代理访问
response = requests.get("http://www.baidu.com/", proxies = proxies)


以上就是关于 requests 库的一些常用方法,到现在为止,我们基本可以拿到我们想要的网页内容,或者设置访问头部、或者使用代理等


Python系列

Python系列会持续更新,从基础入门到进阶技巧,从编程语法到项目实战。若您在阅读的过程中发现文章存在错误,烦请指正,非常感谢;若您在阅读的过程中能有所收获,欢迎一起分享交流。

如果你也想和我一起学习Python,关注我吧!

学习Python,我们不只是说说而已


不知道你们有没有发现,我改名字了!

为什么改成『小一』呢,我还想了挺久的,一直没想好。

后来想了想,我现在刚迈出自己的第一步,从0到1,也正好处于第一阶段,干脆就叫小一算了。

当然,小千小万也不是不可以?



End




限时领取,100G+数据分析干货资料免费领小白学爬虫系列-基础-两种爬虫实现方式
小白学爬虫系列-基础-准备工作
Python入门进阶汇总(全)
Python入门基础教程-补充
Python入门基础汇总


在看点这里

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存